#include "process_pool.h"

#define FILENAME "file"

void sigFunc(int sigNum)
{
    if(sigNum == SIGPIPE)
    {
        printf("Child :id %d  client disconneted, child crash\n",getpid());
        exit(404);
    }
}
int trans_file(int newFd)
{
    signal(SIGPIPE,sigFunc);
    //发送文件名
    train_t dataTrain;
    dataTrain.dataLen = strlen(FILENAME);//规范是要转换大小端
    strcpy(dataTrain.buf,FILENAME);
    send(newFd,&dataTrain,4+dataTrain.dataLen,0);
    //发送文件大小
    struct stat statbuf;
    stat(FILENAME,&statbuf);
    dataTrain.dataLen = sizeof(off_t);
    memcpy(dataTrain.buf,&statbuf.st_size,dataTrain.dataLen);
    send(newFd,&dataTrain,4+dataTrain.dataLen,0);
    //发送文件的内容
    //在改进版本的server里，
    //对发送文件内容的方式做出改进，
    //利用mmap 的DMA技术，直接
    int fd = open(FILENAME,O_RDWR);//使用mmap时，记得把这改成可读可写，否则可能会有权限问题
    ERROR_CHECK(fd,-1,"open");
    char *pmap = (char *)mmap(NULL,statbuf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
    ERROR_CHECK(pmap,(char *)-1,"mmap in trans_file");
    send(newFd,pmap,statbuf.st_size,0);//这里注意理解mmap 的 零拷贝！
    //发送结束标志
    dataTrain.dataLen = 0;
    send(newFd,&dataTrain,4+dataTrain.dataLen,0);
    return 0;
}

